//
//  HMUserAccountViewModel.swift
//  WeiBo14
//
//  Created by HM on 16/3/5.
//  Copyright © 2016年 HM. All rights reserved.
//  处理与帐户登录相关的一些逻辑操作

import UIKit

class HMUserAccountViewModel: NSObject {
    
    // 判断用户是否登录:
    var userLogon: Bool {
        // 1. 是否有 accessToken // 2. accessToken是否过期
        if self.accessToken != nil && !self.isExpiresIn {
            return true
        }
        return false
    }
    
    var accessToken: String? {
        return account?.access_token
    }
    
    // 判断当前帐户的accessToken是否过期,如果过期return true/ 否则 false
    var isExpiresIn: Bool {
        // 拿着过期时间与当前时间进行对比,如果当前时间小于过期时间 就 没有过期,那就返回 false
        if NSDate().compare(account!.expiresDate!) == .OrderedAscending {
            return false
        }
        return true
    }
    
    // 当前模型视图引用的 模型
    var account: HMUserAccount? {
        didSet{
            print("外界给我赋值啦!~!!!")
        }
    }
    
    static let sharedAccountViewModel: HMUserAccountViewModel = {
        let vm = HMUserAccountViewModel()
//        // 获取路径
//        let file = (NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).last! as NSString).stringByAppendingPathComponent("account.archive")
//        // 去解档
//        let result = NSKeyedUnarchiver.unarchiveObjectWithFile(file) as? HMUserAccount
//        // 赋值account
        vm.account = vm.loadAccount()
        return vm
    }()
    
    /// 去请求accessToken
    ///
    /// - parameter code: 授权码
    func loadAccessToken(code: String, callback:(isSuccess: Bool)->()){
        
        // 请求地址
        let urlString = "https://api.weibo.com/oauth2/access_token"
        
        /**
         必选	类型及范围	说明
         client_id	true	string	申请应用时分配的AppKey。
         client_secret	true	string	申请应用时分配的AppSecret。
         grant_type	true	string	请求的类型，填写authorization_code
         
         grant_type为authorization_code时
         必选	类型及范围	说明
         code	true	string	调用authorize获得的code值。
         redirect_uri	true	string	回调地址，需需与注册应用里的回调地址一致。
         */
         
        // 请求的参数
        let parameters = [
            "client_id": WB_APPKEY,
            "client_secret": WB_APPSECRET,
            "grant_type": "authorization_code",
            "code": code,
            "redirect_uri":WB_REDIRECT_URI
        ]
        
        // 发送请求
        HMNetworkTools.sharedTools.requst(.POST, urlString: urlString, parameters: parameters) { (responseObject, error) -> () in
            if error != nil {
                print("\(error)")
                // 告诉外界我请求失败
                callback(isSuccess: false)
                return
            }
            // 进行字典转模型,并且获取用户的个人信息
            let account = HMUserAccount(dict: responseObject!)
            print(account)
            // 获取用户的个人信息
            self.loadUserInfo(account, callback: callback)
        }
    }
    
    
    /// 加载用户信息
    ///
    /// - parameter account: 用户个人信息的模型
    private func loadUserInfo(account: HMUserAccount, callback:(isSuccess: Bool)->()){
        
        let urlString = "https://api.weibo.com/2/users/show.json"
        
        guard let accessToken = account.access_token, uid = account.uid else {
            print("参数不够")
            callback(isSuccess: false)
            return
        }
        
        // 请求参数
        let parameters = [
            "access_token": accessToken,
            "uid": uid
        ]
        
        HMNetworkTools.sharedTools.requst(.GET, urlString: urlString, parameters: parameters) { (responseObject, error) -> () in
            if error != nil {
                print("个人信息请求错误")
                callback(isSuccess: false)
                // SVProgressHUD.showErrorWithStatus("个人信息请求错误")
                return
            }
            print(responseObject)
            
            // 1. 获取到用户的昵称与头像并设置到模型里面去
            account.screen_name = responseObject!["screen_name"] as? String
            account.avatar_large = responseObject!["avatar_large"] as? String
            
            // 2. 保存用户的登录的模型(以便下次进入软件的时候,直接使用)
            
            
            // 归档
            
            // 归档的路径
            self.saveUserAccount(account)
            // 能当前视图模型身上的模型赋值
            self.account = account
            
            // 回调闭包,说登录成功
            callback(isSuccess: true)
        }
    }
    
    // 归档与解档路径
    private let archiveFile = (NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).last! as NSString).stringByAppendingPathComponent("account.archive")
    
    // 解档
    private func loadAccount() -> HMUserAccount? {
        return NSKeyedUnarchiver.unarchiveObjectWithFile(archiveFile) as? HMUserAccount
    }
    
    
    // 保存用户信息
    private func saveUserAccount(account: HMUserAccount) {
        NSKeyedArchiver.archiveRootObject(account, toFile: archiveFile)
    }
}
